iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1
Google Developers Machine Learning

成為機器學習的王者系列 第 3

Day3 機器學習-資料正規化、標準化

  • 分享至 

  • xImage
  •  

回顧一下機器學習的流程,昨天大致講解機器學習的處理流程,並且說明在資料前處理上,如何整理缺失值、異常值及離群值,今天要來講解,如何做到資料正規化(Normalization)與標準化(standardization)。

資料前處理步驟

  1. 資料清理(包含清理缺失值、異常值、離群值等)
  2. 資料正規化
  3. 資料標準化

資料清理

清理離群值、異常值或空值的資料,如在資料預測屬性中(1:男性,2:女性),若在該屬性資料中出現4,則此筆資料是未定義性別,因此需刪除此筆異常值資料。

# isnull()當缺失值位置為True,非缺失值位置為False的DataFrame
dataframe = df.isnull()
# 刪除缺失的行
df_nan_row = df.dropna(axis=0)
# 刪除缺失的列(一般不因為某列有缺失值就刪除列,因為列常代表某指標,但可能會因為該列近全部的資料皆為空值時,回刪除該列資料)
df_nan_col = df.dropna(axis=1)
# 以平均值替代缺失值
df1_fill_lack2 = df1.fillna(df1.mean())

# drop_duplicates()直接對重複資料(行)進行刪除
df_isdup = df.duplicated()

正規化(Normalization)

為什麼要做資料正規化?

在大數據的世界,資料會以多種不同的方式呈現,例如性別資料會以F代指男性、以M代指女性;或是以UCI Dataset的Mushroom資料集為例,在紀錄氣味的欄位(odor),出現了a、l、c、y、f、m、n、p、s,分別紀錄不同類型的氣味。

欄位名稱 說明 類型
odor 氣味 almond=a,anise=l,creosote=c,fishy=y,foul=f,musty=m,none=n,pungent=p,spicy=s

而在機器的世界中,無法了解到這些英文字母(類別的資料)對應之間的關係,我們只能將這些資料轉換為數值,讓機器識別,常見的資料正規化方法:

  • Label Encoding
  • One-hot Encoding

Label Encoding

簡單來說,就是把資料表中的每個類別 mapping 到某個整數,不會增加新欄位。
可以使用sklearn框架的LabelEncoder模組,延續剛剛介紹的mushroom資料集為例

from sklearn.preprocessing import LabelEncoder

#data.columns
dic={'class', 'cap-shape', 'cap-surface', 'cap-color', 'bruises', 'odor',
       'gill-attachment', 'gill-spacing', 'gill-size', 'gill-color',
       'stalk-shape', 'stalk-root', 'stalk-surface-above-ring',
       'stalk-surface-below-ring', 'stalk-color-above-ring',
       'stalk-color-below-ring', 'veil-type', 'veil-color', 'ring-number',
       'ring-type', 'spore-print-color', 'population', 'habitat'}
labelencoder = LabelEncoder()

data['class'] = labelencoder.fit_transform(data['class'])
data['cap-shape'] = labelencoder.fit_transform(data['cap-shape'])
data['cap-surface'] = labelencoder.fit_transform(data['cap-surface'])
data['cap-color'] = labelencoder.fit_transform(data['cap-color'])
data['bruises'] = labelencoder.fit_transform(data['bruises'])
data['odor'] = labelencoder.fit_transform(data['odor'])
data['gill-attachment'] = labelencoder.fit_transform(data['gill-attachment'])
data['gill-spacing'] = labelencoder.fit_transform(data['gill-spacing'])
data['gill-size'] = labelencoder.fit_transform(data['gill-size'])
data['gill-color'] = labelencoder.fit_transform(data['gill-color'])
data['stalk-shape'] = labelencoder.fit_transform(data['stalk-shape'])
data['stalk-root'] = labelencoder.fit_transform(data['stalk-root'])
data['stalk-surface-above-ring'] = labelencoder.fit_transform(data['stalk-surface-above-ring'])
data['stalk-surface-below-ring'] = labelencoder.fit_transform(data['stalk-surface-below-ring'])
data['stalk-color-above-ring'] = labelencoder.fit_transform(data['stalk-color-above-ring'])
data['stalk-color-below-ring'] = labelencoder.fit_transform(data['stalk-color-below-ring'])
data['veil-type'] = labelencoder.fit_transform(data['veil-type'])
data['veil-color'] = labelencoder.fit_transform(data['veil-color'])
data['ring-number'] = labelencoder.fit_transform(data['ring-number'])
data['ring-type'] = labelencoder.fit_transform(data['ring-type'])
data['spore-print-color'] = labelencoder.fit_transform(data['spore-print-color'])
data['population'] = labelencoder.fit_transform(data['population'])
data['habitat'] = labelencoder.fit_transform(data['habitat'])

data

原始資料與經過Label encoding結果

One-hot Encoding

在屬性資料中,機器只能接收數值資料,但將這些類別資料轉換為數值,然而數值與數值之間有大小、距離的關係,若是沒有大小之間的關係,這樣的資料就不適用Label Encoding的方式,需要使用One-hot Encoding。
就是把資料表中的每個類別 mapping 對應的欄位,經過One-hot Encoding,會增加資料表的欄位。

可以使用sklearn中的OneHotEncoder模組處理

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])
x = onehotencoder.fit_transform(x).toarray()

呈現結果

標準化(standardization)

為什麼要做資料標準化?

在大數據資料中,是用不同資料欄位與資料值所組成,他們可能分佈狀況可能都不盡相同,因此,就必須將特徵資料按比例縮放,讓資料落在某一特定的區間。

舉例來說,學生A的數學成績比學生B高1分,學生B的英文成績比學生A的高1分,那整體來說A的成績還是B的成績比較好?
答案是: 學生A
將英文及數學成績分佈區間皆設定為[0,1]之間,此時,A的英文成績高 1/20 分;B的數學成績高 1/100 分。

學生 數學成績 英文成績
A 90 80
B 91 79
成績分佈 0~100 60~80

如下圖,藍色的圈圈圖代表的是兩個特徵的等高線,左圖的特徵[X1,X2]區間相差非常大,所以對應的等高線非常尖,會導致在使用梯度下降法尋求最佳解時,需要很迭代多次才可以收斂;而右圖對兩個原始特徵進行了標準化,其對應的等高線顯得較圓,在梯度下降進行求解時,能較快的收斂。

python資料預處理 :資料標準化
https://www.itread01.com/content/1543176304.html

常見的資料標準化方式:

  • Max-Min
  • Z-Score
  • MaxAbs
  • RobustScaler

Max-Min

常見的資料標準化方法,簡單來說,將原始資料的最大、最小值mapping至區間[0,1]
**公式:**新資料=(原始資料-最小值)/(最大值-最小值)

from sklearn import preprocessing
#建立MinMaxScaler物件
minmax = preprocessing.MinMaxScaler()
# 資料標準化
data_minmax = minmax.fit_transform(df)

Z-Score

利用原始資料的均值(mean)和標準差(standard deviation)進行資料的標準化,適用於資料的最大值和最小值未知的情況,或有超出取值範圍的離群資料的情況。
**公式:**新資料=(原始資料-均值)/標準差

from sklearn import preprocessing
#建立StandardScaler物件
zscore = preprocessing.StandardScaler()
# 資料標準化
data_zs = zscore.fit_transform(df)

MaxAbs

最大值絕對值標準化(MaxAbs),根據最大值的絕對值進行標準化
公式:新資料 = 原始資料 / |原始資料的最大值|
其中max為x鎖在列的最大值,資料區間為[-1, 1],因此適用於稀疏矩陣。

from sklearn import preprocessing
#建立MinMaxScaler物件
maxabs = preprocessing.MaxAbsScaler()
# 資料標準化
data_maxabs = maxabs.fit_transform(df)

RobustScaler

有時候,資料集中存在離群點,就需要利用RobustScaler針對離群點做標準化處理,該方法對資料中心化的資料的縮放更強的引數控制能力。

from sklearn import preprocessing
#建立RobustScaler物件
robust = preprocessing.RobustScaler()
# 資料標準化
data_rob = robust.fit_transform(df)

參考資料

  1. Label Encoder vs. One Hot Encoder in Machine Learning

https://medium.com/@contactsunny/label-encoder-vs-one-hot-encoder-in-machine-learning-3fc273365621

  1. [資料分析&機器學習] 第2.4講:資料前處理(Missing data, One-hot encoding, Feature Scaling)

https://medium.com/jameslearningnote/%E8%B3%87%E6%96%99%E5%88%86%E6%9E%90-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%AC%AC2-4%E8%AC%9B-%E8%B3%87%E6%96%99%E5%89%8D%E8%99%95%E7%90%86-missing-data-one-hot-encoding-feature-scaling-3b70a7839b4a

  1. python資料預處理 :資料標準化

https://www.itread01.com/content/1543176304.html

本日心得

今天在研究室唱歌,突然坐後面的同學從椅子上跌下來,想說有這麼誇張嗎/images/emoticon/emoticon04.gif
結果他是在接網路線XD


上一篇
Day2 機器學習介紹
下一篇
Day4 機器學習-特徵工程(資料過濾)
系列文
成為機器學習的王者7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言